#include <bits/stdc++.h>
using namespace std;

const int N = 5e3+5;

int dp[N * 2][N];

vector<int> upt[N];

int n, m, k;

struct node {
    int a, b, c;
    node(int a=0, int b=0, int c=0):a(a), b(b), c(c) {}
} a[N];

int fin[N];

int b[N * 3], bcnt;

inline void update(int &a, int b) {
    if (a == -1 || a < b) a = b;
}

int main(int argc, char const *argv[])
{
    scanf("%d%d%d", &n, &m, &k);
    for (int i=1; i<=n; ++i) {
        scanf("%d%d%d", &a[i].a, &a[i].b, &a[i].c);
    }
    for (int i=1; i<=n; ++i) {
        fin[i] = i;
    }
    for (int i=0; i<m; ++i) {
        int u, v; scanf("%d%d", &u, &v);
        fin[v] = max(u, fin[v]);
    }

    for (int i=1; i<=n; ++i) {
        // b[++bcnt] = i;
        // for (int x : fin[i]) b[bcnt++] = -x;
        upt[fin[i]].push_back(a[i].c);
    }

    for (int i=1; i<=n; ++i) {
        b[++bcnt] = i;
        for (int x : upt[i]) b[++bcnt] = -x;
    }
    memset(dp, -1, sizeof dp);
    dp[0][k] = 0;

    for (int i=0; i<bcnt; ++i) {

        for (int j=0; j<N; ++j) {
            if (!~dp[i][j]) continue;
            // if (i == 6 && j == 16) {
            //     printf("%d\n", b[i+1]);
            // }
            if (b[i+1] > 0 && j >= a[b[i+1]].a && j + a[b[i+1]].b < N) {
                // if (i == 0) {
                //     printf("i=%d, j=%d, j+a[b[i+1]].b=%d\n", i, j, j+a[b[i+1]].b);
                //     return 0;
                // }
                update(dp[i+1][j+a[b[i+1]].b], dp[i][j]);
                // printf("upt 1 %d %d %d\n", b[i+1], i+1, j+a[b[i+1]].b);
            } else if (b[i+1] <= 0) {
                update(dp[i+1][j], dp[i][j]);
                if (j > 0)
                    update(dp[i+1][j-1], dp[i][j] - b[i+1]);
                // printf("upt 2 %d %d %d %d %d\n", b[i+1], i+1, j-1, i, j);
            }
        }
    }
    int ans = -1;
    for (int j=0; j<N; ++j) {
        update(ans, dp[bcnt][j]);
    }
    printf("%d\n", ans);
    // printf("%d\n", dp[7][16]);

    return 0;
}
